/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package byblos.negocio.pacote;

import byblos.negocio.acomodacao.CategoriaAcomodacao;
import byblos.negocio.acomodacao.TipoAcomodacao;
import byblos.negocio.objeto.Objeto;
import byblos.negocio.objeto.TipoObjeto;
import byblos.persistencia.Removivel;
import byblos.util.Periodo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

/**
 *
 * @author Diego
 */
@Entity
@NamedQueries(value = {@NamedQuery(name = "PacotePorIdioma", query = "SELECT p FROM Pacote p WHERE p.idioma = ?1 AND p.removido = false"),
    @NamedQuery(name = "PacotePorIdiomaHome", query = "SELECT p FROM Pacote p WHERE p.visivelHome = true AND p.idioma = ?1 AND p.removido = false")
})
public abstract class Pacote<I extends ItemPacoteCategoria> extends Objeto implements Removivel, Serializable {

    private boolean visivelHome = true;
    @Column(columnDefinition = "text")
    private String textoHome;
    @Column(columnDefinition = "text")
    private String textoCondicoes;
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pacote", targetEntity = ItemPacoteCategoria.class)
    private List<I> itens = new ArrayList<I>();
    private boolean exclusividadeReserva;
    @Transient
    private TipoPacote tipoPacote;
    private boolean removido;

    public boolean isRemovido() {
        return removido;
    }

    public void setRemovido(boolean removido) {
        this.removido = removido;
    }

    public Pacote() {
        super(TipoObjeto.PACOTE);
    }

    public Pacote(TipoPacote tipoPacote) {
        this();
        this.tipoPacote = tipoPacote;
    }

    public abstract Calendar getInicio();

    public abstract Calendar getTermino();

    public Periodo getPeriodo() {
        return new Periodo(getInicio(), getTermino());
    }

    public I adicionarItem(CategoriaAcomodacao categoria) {
        I item = (I) tipoPacote.getItem();
        item.setCategoria(categoria);
        item.setPacote(this);
        itens.add(item);
        return item;
    }

    public I getItemCategoria(CategoriaAcomodacao categoria) {
        for (ItemPacoteCategoria itemPacoteCategoria : itens) {
            if (itemPacoteCategoria.getCategoria().equals(categoria)) {
                return (I) itemPacoteCategoria;
            }
        }
        return (I) adicionarItem(categoria);
    }

    public double getValor(CategoriaAcomodacao categoria, TipoAcomodacao tipoAcomodacao, boolean temporada) {
        return getItemCategoria(categoria).getValor(tipoAcomodacao, temporada);
    }

    public void setValor(double valor, CategoriaAcomodacao categoria, TipoAcomodacao tipoAcomodacao, boolean temporada) {
        getItemCategoria(categoria).setValor(valor, tipoAcomodacao, temporada);
    }

    public boolean isExclusividadeReserva() {
        return exclusividadeReserva;
    }

    public void setExclusividadeReserva(boolean exclusividadeReserva) {
        this.exclusividadeReserva = exclusividadeReserva;
    }

    public List<I> getItens() {
        return itens;
    }

    public void setItens(List<I> itens) {
        this.itens = itens;
    }

    public String getTextoCondicoes() {
        return textoCondicoes;
    }

    public void setTextoCondicoes(String textoCondicoes) {
        this.textoCondicoes = textoCondicoes;
    }

    public String getTextoHome() {
        return textoHome;
    }

    public void setTextoHome(String textoHome) {
        this.textoHome = textoHome;
    }

    public boolean isVisivelHome() {
        return visivelHome;
    }

    public void setVisivelHome(boolean visivelHome) {
        this.visivelHome = visivelHome;
    }

    public TipoPacote getTipoPacote() {
        return tipoPacote;
    }

    public void setTipoPacote(TipoPacote tipoPacote) {
        this.tipoPacote = tipoPacote;
    }
}
